#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
using namespace std;

const string identifier_spaces = " ";
const string cell = "\n";
// 序列化

// 反序列化

// 封装
string Encode(string &message)
{
    string newmessage = to_string(message.size());
    newmessage += cell;
    newmessage += message;
    newmessage += cell;
    return newmessage;
}
// 解码
//  "9"/n"x + y"/n
bool Decode(string &package, string &out)
{
    int len_pos = package.find(cell);
    if (len_pos == string::npos)
        return false;
    string len_str = package.substr(0, len_pos);
    size_t len = std::stoi(len_str);
    int total_len = len_str.size() + len + 2;
    if (total_len != package.size())
        return false;

    string message_str = package.substr(len_pos + 1, len);
    //  package.erase(0, total_len);
    out = message_str;

    return true;
}

class request
{
public:
    int x;
    int y;
    char op;

public:
    request(int data1, int data2, char oper) : x(data1), y(data2), op(oper)
    {
    }
    request() {}
    // 序列化 "x + y"
    bool Serialize(string &out)
    {
        // string message;
        // message = to_string(x);
        // message += identifier_spaces;
        // message += op;
        // message += identifier_spaces;
        // message += to_string(y);
        // out = message;
        Json::Value root;
        root["x"] = x;
        root["op"] = op;
        root["y"] = y;
        Json::StyledWriter w;
        out = w.write(root);
        return true;
    }

    // 反序列化 "x + y"
    bool Deserialize(string &out)
    {
        // string in_message = out;
        // int pos = in_message.find(identifier_spaces);
        // if (pos == string::npos)
        //     return false;
        // string part1 = in_message.substr(0, pos);
        // int pos1 = in_message.rfind(identifier_spaces);
        // if (pos1 == string::npos)
        //     return false;
        // string part2 = in_message.substr(pos + 1);

        // x = stoi(part1);
        // y = stoi(part2);
        // op = in_message[pos + 1];
        Json::Value root;
        Json::Reader r;
        r.parse(out, root);
        x = root["x"].asInt();
        y = root["y"].asInt();
        op = root["op"].asInt();
        return true;
    }
    ~request()
    {
    }
};

class response
{

public:
    int result_;
    int code_;

public:
    response() {}
    response(int result, int code) : result_(result), code_(code)
    {
    }
    // 序列化
    string Serialize(string &out)
    {
        // string message;
        // message = to_string(result_);
        // message += identifier_spaces;
        // message += to_string(code_);
        // out = message;
        Json::Value root;
        root["result"] = result_;
        root["code"] = code_;
        Json::StyledWriter w;
        out = w.write(root);
        return out;
    }

    bool Deserialize(string &str)
    {
        // string in_message = str;
        // int pos = in_message.find(identifier_spaces);
        // if (pos == string::npos)
        //     return false;
        // string part1 = in_message.substr(0, pos);
        // string part2 = in_message.substr(pos + 1);
        // result_ = stoi(part1);
        // code_ = stoi(part2);
        Json::Value root;
        Json::Reader r;
        r.parse(str, root);
        result_ = root["result"].asInt();
        code_ = root["code"].asInt();
        return true;
    }

    ~response() {}
};